Labyrinth only uses one compressed file
This contains all the images used in the stage (a whopping 10)
//80042030:	load images to memory using control block
LW	A1,0028 (S3)	;A1=ROM offset
LW	A2,002C (S3)	;A2=size
ADDU	A0,S4,R0	;A0=target
JAL	8000B9B8
ADDU	A1,A1,S0	;A1=ROM address (S0=0x54D910 base offset)
//80042044:	decompress if necessary
JAL	8001499C
ADDU	A0,S4,R0	;A0=p->data
//8004204C:
ADDU	S0,V0,R0	;S0=size of decompressed data or 0 if not EDL
BEQ	S0,R0,8004207C
NOP
//80042058:	handle EDL files
ADDU	A0,S0,R0	;A0=decompressed size
JAL	80083E90	;set aside room in buffer for file; returns V0=p->buffer
ADDIU	A1,R0,001A	;A1=0x1A	bank#
ADDU	S7,V0,R0	;S7=target
ADDU	A0,S7,R0	;A0=target
JAL	80014A0C
ADDU	A1,S4,R0	;A1=EDL data
J	800420A0
ADDU	A0,S4,R0
//8004207C:


8001499C:	returns V0=0 if not EDL or size of decompressed data
ADDIU	SP,SP,FFC8
ADDIU	V0,R0,0001
SW	A0,0014 (SP)	;save p->data
ADDIU	A0,SP,0010
SW	RA,0030 (SP)
JAL	800148A4	;determine if EDL compressed
SW	V0,0024 (SP)	;save 1: expected endianess.  In this case, big endian
//800149B8:
LW	V0,002C (SP)	;V0=error level: 0 if EDL, -3 if not, -4 if bad compression
BNEZ	V0,800149C8
ADDU	V0,R0,R0
LW	V0,001C (SP)	;V0=expected size of decompressed data
LW	RA,0030 (SP)
JR	RA
ADDIU	SP,SP,0038

800148A4:	determine if file is EDL compressed and retrieve data
	S0+1C=error register
		0	no errors
		-3	not an EDL compressed file
		-4	unknown compression type
ADDIU	SP,SP,FFE8
SW	S0,0010 (SP)	;save S0
ADDU	S0,A0,R0	;S0=SP+28
SW	RA,0014 (SP)
LW	A0,0004 (SP)	;A0=p->data
LBU	V1,0000 (A0)	;V1=1st byte of data
ADDIU	V0,R0,0045
BNE	V1,V0,800149A8	;branch if V1!='E'
ADDIU	V0,R0,FFFD	;V0=-3
LBU	V1,0001 (A0)	;V1=2nd byte of data
ADDIU	V0,R0,0044
BNE	V1,V0,80014948	;branch if V1!='D'
ADDIU	V0,R0,FFFD	;V0=-3
LBU	V1,0002 (A0)	;V1=3rd byte of data
ADDIU	V0,R0,004C
BNE	V1,V0,80014948	;branch if V1!='L'
ADDIU	V0,R0,FFFD	;V0=-3
//800148E8:
LBU	V0,0003 (A0)	;V0=4th byte
LW	V1,0004 (S0)	;V1=SP+4: p->data
SRL	V0,V0,0x7	;test if 0x80 bit present, which it almost always will be
SW	V0,0018 (S0)	;S0+18=endianess
LBU	V0,0003 (V1)	;V0=4th byte
ANDI	V1,V0,007F	;mask away 0x80 bit
SLTI	V0,V1,0003
BEQ	V0,R0,80014944	;value should be 0-2
SW	V1,0010 (S0)	;S0+10=compression type
BLTZ	V1,80014948	;could avoid this by using SLTIU, but whatever
ADDIU	V0,R0,FFFC
//80014914:
LW	V0,0004 (S0)	;V0=p->data
SW	R0,001C (S0)	;S0+1C=0	no error
LW	A1,0004 (V0)	;A1=compressed size
JAL	8001495C	;not that there's a need to 32bit byteswap...
ADDU	A0,S0,R0	;A0=stack+28
LW	V1,0004 (S0)	;V1=p->data
SW	V0,0008 (S0)	;S0+8=compressed size
LW	A1,0008 (V1)	;A1=expected decompressed size
JAL	8001495C	;not that there's a need to 32bit byteswap...
ADDU	A0,S0,R0	;A0=stack+28
J	8001494C
SW	V0,000C (S0)	;S0+C=decompressed size
//80014944:
ADDIU	V0,R0,FFFC	;-4 if not a valid compression type
//80014948:
SW	V0,001C (S0)	;S0+1C=error flag
//8001494C:
LW	RA,0014 (SP)
LW	S0,0010 (SP)
JR	RA
ADDIU	SP,SP,0018

8001495C:	32bit byteswap routine
LW	V1,0018 (A0)	;V1=1 if 0x80 set on compression type
LW	V0,0014 (A0)	;V0=value saved by 8001499C: 1
BEQ	V1,V0,80014990	;all EDL's use the 0x80 flag, so this is always true
SRL	V1,A1,0x18
SRL	V0,A1,0x8
ANDI	V0,V0,FF00
ADDU	V1,V1,V0
ANDI	V0,A1,FF00
SLL	V0,V0,0x8
ADDU	V1,V1,V0
SLL	V0,A1,0x18
J		80014994
ADDU	V0,V1,V0	;V0=offset value 32bit byteswapped!
//80014990:
ADDU	V0,A1,R0
JR	RA
NOP

80083E90	probably makes space for the decompressed file
	expects A0=decompressed size, A1=? [1A]
LUI	V0,800E
LB	V0,1A90 (V0)	;V0=800E1A90: ?
BNEZ	V0,80083F40
ADDU	A3,A0,R0	;A3=decompressed size
//80083EA0:
SLL	V0,A1,0x1
ADDU	V0,V0,A1
SLL	T0,V0,0x2	;T0=A1*0xC
LUI	V0,800D
ADDU	V0,V0,T0
LBU	V0,E358 (V0)	;V0=800CE358+offset: byte from third word of 800CE358 table
ADDIU	A2,V0,FFFF	;A2=value-1
ADDIU	V0,R0,002D
BNE	A1,V0,80083F00	;test if bank 0x2D...
NOR	V0,R0,A2	;V0=mask for value pulled from table
//80083EC8:
...
//80083F00:
LUI	A1,8011
LW	A1,9A90 (A1)	;A1=80109A90: current buffer address [8023D87C]
LUI	A0,800D
ADDU	A0,A0,T0
LW	A0,E354 (A0)	;A0=800CE354+offset: size of block
ADDU	V1,A1,A2
AND	V0,V1,A2
AND	V0,V1,V0
ADDU	V1,V0,A3	;buffer + size of data, accounting for word alignment
LUI	AT,8011
SW	V1,9A90 (AT)	;save new buffer address
SUBU	V1,V1,A1	;V1=size after the compensation
ADDU	A0,A0,V1	;A0=new size of data in buffer
LUI	AT,800D
ADDU	AT,AT,T0
J	80084040
SW	A0,E354 (AT)	;stow it away
//80083F40:
...
//80084040:
JR	RA
NOP

80014A0C	redirect to decompressor
	accepts: A0=p->EDL data, A1=target
ADDIU	SP,SP,FFC8
ADDIU	V0,R0,0001	;V0=1
SW	A0,0010 (SP)	;SP+10=data
ADDIU	A0,SP,0010	;A0=SP+10
SW	RA,0030 (SP)
SW	V0,0024 (SP)	;A0+14=1
JAL	80014818
SW	A1,0014 (SP)	;A0+4=target
LW	V0,002C (SP)
LW	RA,0030 (SP)
SLTIU	V0,V0,0001
JR	RA
ADDIU	SP,SP,0038


80014818	
ADDIU	SP,SP,FFE8
SW	S0,0010 (SP)	;SP+10= decompressed size
SW	RA,0014 (SP)
JAL	800148A4	;determine if EDL compressed
ADDU	S0,A0,R0	;S0=SP+28
//8001482C:
LW	V0,001C (S0)	;V0=error code
BNEZ	V0,80014894	;quit if not EDL or bad compression type
ADDIU	V0,R0,0001
LW	V1,0010 (S0)	;V1=compression type
BEQ	V1,V0,8001487C	;branch if type 1
SLTI	V0,V1,0002
BEQL	V0,R0,8001485C	;branch if >2
ADDIU	V0,R0,0002
BEQ	V1,R0,8001486C	;branch if 0
NOP
J	80014894
NOP
//8001485C:
BEQ	V1,V0,8001488C	;quit if not type 2
NOP
J	80014894
NOP
//8001486C:	type 0 compression
JAL	80013430
ADDU	A0,S0,R0
J	80014894
NOP
//8001487C:	type 1 compression
JAL	800134D0
ADDU	A0,S0,R0
J	80014894
NOP
//8001488C:	type 2 compression
JAL	80013F74
ADDU	A0,S0,R0
//80014894:
LW	RA,0014 (SP)
LW	S0,0010 (SP)
JR	RA
ADDIU	SP,SP,0018

